﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZOVNP.Model.Abstracts
{
    /// <summary> Интерфейс для навигационного свойства - коллекции на список доменных объектов. </summary>
    /// <typeparam name="T"> Тип доменного объекта. </typeparam>
    public interface IDomainCollection<T> : IEnumerable<T>, IDomainRelation
    {
        /// <summary> Маркерный вспомогательный метод для множественного попутного извлечения коллекций связанных дочерних объектов внутри одного запроса к родительскому объекту. </summary>
        /// <remarks> Этот метод используется исключительно для трансляции и получения специфического для хранилища текста запроса. Метод имеет пустую реализацию, выбрасывающую исключение. </remarks>
        /// <returns> Ссылка на отдельный элемент коллекции, с которого можно сделать ещё одно обращение к коллекции дочерних объектов. </returns>
        T MarkIncluded();
        /// <summary> Получить число элементов в коллекции. </summary>
        /// <remarks>
        /// <returns> Число элементов в коллекции. </returns>
        /// Поведение этого метода зависит от того, загружена ли уже коллекция. Если коллекция загружена и
        /// свойство <c>IsLoaded</c> равно <c>true</c>, то проверяется число загруженных элементов. Если же
        /// коллекция ещё не загружалась и свойство <c>IsLoaded</c> равно <c>false</c>, то к хранилищу данных
        /// направляется запрос на получение числа элементов коллекции без их загрузки.
        /// </remarks>
        int GetCount();
        /// <summary> Получить признак того, что коллекция не содержит элементов. </summary>
        /// <returns> True, если коллекция пуста. </returns>
        /// <remarks>
        /// Поведение этого метода зависит от того, загружена ли уже коллекция. Если коллекция загружена и
        /// свойство <c>IsLoaded</c> равно <c>true</c>, то проверяется число загруженных элементов. Если же
        /// коллекция ещё не загружалась и свойство <c>IsLoaded</c> равно <c>false</c>, то к хранилищу данных
        /// направляется запрос на получение числа элементов коллекции без их загрузки.
        /// </remarks>
        bool IsEmpty();
        /// <summary>
        /// Добавить объект в коллекцию. Добавляемый объект становится дочерним по отношению к объекту,
        /// владеющему данной коллекцией дочерних объектов.
        /// </summary>
        /// <param name="Item"> Объект, связываемый с данной коллекцией. </param>
        void Add(T Item);
        /// <summary>
        /// Удалить объект из коллекции. Этот объект перестаёт быть дочерним по отношению к объекту,
        /// владеющему данной коллекцией дочерних объектов.
        /// </summary>
        /// <param name="Item"> Объект, который нужно удалить из коллекции. </param>
        /// <remarks>
        /// The Remove method also deletes the relationship between the source object and the object
        /// being removed from the collection. If the relationship has a referential integrity constraint,
        /// calling the Remove method on a dependent object marks both the relationship and the dependent
        /// object for deletion. This occurs because the constraint indicates that the dependent object
        /// cannot exist without a relationship to the parent. For more information, see Referential
        /// Constraints (Entity Framework).
        /// </remarks>
        void Remove(T Item);
        /// <summary> Удалить все объекты из коллекции. </summary>
        /// <remarks> Результат выполнения этого метода эквивалентен вызову метода <c>Remove</c> над всеми сущностями коллекции. </remarks>
        void RemoveAll();
        /// <summary> Очистить коллекцию. </summary>
        /// <remarks>
        /// Метод выполняет следующие действия.
        /// 1. Устанавливает флаг IsLoaded в значение false.
        /// 2. Удаляет все сущности из коллекции.
        /// 3. Detaches relationships between removed entities and the owner of the EntityCollection from the ObjectStateManager.
        /// 4. Removes the owner of the EntityCollection from the related entities. 
        /// </remarks>
        void Clear();
    }
}
